jad

反编译指定已加载类的源码

jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;

  • 在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便
  • 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解

反编绎时只显示源代码

默认情况下,反编译结果里会带有ClassLoader信息,通过--source-only选项,可以只打印源代码。方便和mc/redefine命令结合使用。

反编译UserController,保存到 /tmp/UserController.java文件里。

jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

反编译指定的函数

$ jad demo.MathGame main
 
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
 
Location:
/private/tmp/arthas-demo.jar
 
public static void main(String[] args) throws InterruptedException {
    MathGame game = new MathGame();
    do {
        game.run();
        TimeUnit.SECONDS.sleep(1L);
    } while (true);
}
 
Affect(row-cnt:1) cost in 228 ms.

mc

Memory Compiler/内存编译器,编译.java文件生成.class

mc /tmp/Test.java

可以通过-c参数指定classloader:

mc -c 327a647b /tmp/Test.java

可以通过-d命令指定输出目录:

mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java

编译生成.class文件之后,可以结合redefine命令实现热更新代码。

注意,mc命令有可能失败。如果编译失败可以在本地编译好.class文件,再上传到服务器。具体参考redefine命令说明。

上次更新时间: 2024/5/7 05:59:02